<?php
/*
 * description：
 * author：wh
 * email：
 * createTime：{2025/5/16} {10:53} 
 */

namespace wanghua\general_utility_tools_php\OpenIMSDK;

//初始化，主要是获取管理员token，并将token放到header中，最后统一发送请求，
//此类只做2件事
//1.获取管理员token
//2.统一发送请求
use wanghua\general_utility_tools_php\http\Curl;
use wanghua\general_utility_tools_php\tool\Tools;


/**
 * https://doc.rentsoft.cn/zh-Hans/restapi/apis/introduction
 * Class BaseOpenIMAuth
 * @package app\api\OpenIMSDK
 */
class BaseOpenIMAuth
{
    //地址可更改
    protected $domain = 'https://openim-web-v2.test.com/api';
    protected $secret = 'openIM123';
    protected $userID = 'imAdmin';//超级管理员
    public function __construct($domain='', $secret='', $userID='')
    {
        if($domain){
            $this->domain = $domain;
        }
        if($secret){
            $this->secret = $secret;
        }
        if($userID){
            $this->userID = $userID;
        }
        if(!cache('cache_openim_admin_web_token')){
            $this->getAdminToken();//缓存不存在则获取
        }
    }

    //不对外公开
    private function getAdminToken()
    {
        if(cache('cache_openim_admin_web_token')){
            return cache('cache_openim_admin_web_token');
        }
        //实时请求管理员token
        $url = $this->domain."/auth/get_admin_token";

        $operationID = Tools::getMillisecond();
        $request_data = [
            'secret' => $this->secret,
            'userID' => $this->userID,
        ];
        //权限要求：
        //调用 REST API 需要以 APP 管理员 身份进行，此用户具有超级权限。
        //OpenIM Server 内置了一个 APP 管理员，其 userID 为 imAdmin。
        $header = array(
            'accept: application/json',
            'Content-Type: application/json',
            "operationID: {$operationID}"
        );
        $res = Curl::curl_post_json($url, $request_data, $header);
        if($res['code'] != 200) throw new \Exception('获取管理员token失败.'.$res['msg']);
        $data = json_decode($res['data'], true);
        //数据格式
        if(empty($data)) throw new \Exception('获取管理员token失败.数据格式错误');

        if($data['errCode'] > 0) throw new \Exception('获取管理员token失败.'.$data['errMsg']);

        $token_arr = $data['data'];
        //存储 token,expireTimeSeconds 可以持续缓存，缓存时间小于expireTimeSeconds即可（7776000）
        cache('cache_openim_admin_web_token',$token_arr, 7775000);
        return $token_arr;
    }

    /**
     * desc：获取管理员 token
     * author：wh
     * @return mixed
     */
    function getToken()
    {
        //返回管理员token
        return cache('cache_openim_admin_web_token')['token'];
    }

    /**
     * desc：获取用户 token
     *
     * doc:https://doc.rentsoft.cn/zh-Hans/restapi/apis/authenticationManagement/getUserToken
     * author：wh
     * @param $userID 用户id
     * @param $platformID 平台id 1-9 ；
     * 1：iOS，2：Android，3：Windows，4：OSX，5：WEB，6：小程序，7：linux，8：AndroidPad，9：IPad，10：Admin
     * @return mixed
     * @throws \Exception
     */
    public function getUserToken(string $userID,int $platformID)
    {

        if(cache('cache_openim_user_web_token')){
            return cache('cache_openim_user_web_token');
        }
        $url = $this->domain."/auth/get_user_token";
        $request_data = [
            'platformID'=>$platformID,
            'userID'=>$userID,
        ];
        $res = $this->sendRequest($url, $request_data);

        //缓存
        cache('cache_openim_user_web_token',$res, 7775000);
        return $res;
    }

    /**
     * desc：请求其它接口使用
     * author：wh
     * @param string $url 请求地址
     * @param array $request_data 请求数据
     * @param array $req_header 请求头
     * @return mixed
     * @throws \Exception
     */
    public function sendRequest(string $url, array $request_data,$req_header=[])
    {
        $operationID = Tools::getMillisecond();
        $header = array_merge($req_header,[
            'accept: application/json',
            'Content-Type: application/json',
            'token:'.$this->getToken(),
            "operationID: {$operationID}"
        ]);
        $res = Curl::curl_post_json($url, $request_data, $header);
        if($res['code'] != 200) throw new \Exception('获取管理员token失败.'.$res['msg']);
        $data = json_decode($res['data'], true);
        //数据格式
        if(empty($data)) throw new \Exception('获取管理员token失败.数据格式错误');
        //存储 token,expireTimeSeconds 可以持续缓存，缓存时间小于expireTimeSeconds即可（7776000）
        return $data;
    }

    /**
     * desc：强制用户下线
     * author：wh
     * @param string $userID 用户id
     * @param int $platformID 平台id 1-9
     * @return mixed
     * @throws \Exception
     */
    public function forceLogout(string $userID,int $platformID)
    {
        $url = $this->domain."/auth/force_logout";
        $request_data = [
            'userID'=>$userID,
            'platformID'=>$platformID,
        ];
        return $this->sendRequest($url, $request_data);
    }
}